package ReflectDemo;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

//通过注解运行指定类中的指定方法
//通过注解，可以达到和配置文件一样的效果，而且还更加简洁！！！
@myannotation(className = "ReflectDemo.Stu" , methodName = "function")
public class AnnotationDemo {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        //解析注解:
        //1.获取字节码文件对象，谁使用了注解就获取谁的
        Class<AnnotationDemo> annotationDemoClass = AnnotationDemo.class;
        //2.获取字节码对象上的注解信息
        myannotation annotation = annotationDemoClass.getAnnotation(myannotation.class);
        //3.解析注解
        String className = annotation.className();
        String methodName = annotation.methodName();

        //运行指定类中的指定方法:
        //1.通过类名反射得到Class对象
        Class<?> aClass = Class.forName(className);
        //2.通过Class对象创建一个对象
        Constructor<?> con = aClass.getConstructor();
        Object obj = con.newInstance();
        //3.通过Class得到方法对象
        Method method = aClass.getDeclaredMethod(methodName);
        //4.调用方法
        method.setAccessible(true);
        method.invoke(obj);

    }
}
